*! Given by Yujun Lian, Zhonghao Wei
*! V1.2.2 2019/1/12 15:10

*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
*-Lian   to do list  2019/1/10 23:26
* 1. anything 中可以包含文件路径，参见 GTALabel.ado 程序中的处理方式；
*    GTALabel.ado 项目主页：https://gitee.com/arlionn/GTALabel
     小魏说：V1.2.2还未开始解决此问题
* 2. saving() 选项中也可以包含文件路径，参见 同上
*    小魏说：saving()输入整合后的文件名，默认为appendtxts_output.txt，不需输入扩展名.txt
*    连回复：若用户没有设定后缀，你可以帮他加上 .txt 后缀，如果用户指定了后缀，
*            你要判断这个后缀是否合法，
*                if Yes --> 
*                if Not -->
*            参见 GTALabel.ado
     小魏说：V1.2.1修复了输出到非原始文件夹时会遗漏1个txt文档的情形。
	 小魏说：V1.2.2已更新后缀处理，修复了输入地址以 / \ 等结尾的情况，可创建尚未存在的非中文保存路径。英文测试顺利
	 			  【目前，在saving()里输入中文仍存在问题。
				   saving()里输入中文时能正确运行的情况：
				   		仅在结尾的文件名处输入中文，并且不加任何后缀。
				        路径名中存在中文，并且路径已存在，文件名不加后缀。
				   saving()里输入中文时能报错的情况：
				   		输入了后缀 —— 无法判断.后缀的位置导致出错
						路径有待创建 —— 当前的命令错误解读中文路径导致出错
				   猜测是编码问题导致用ustrrops substr判断和截取出错。有待修复】
* 3. 希望这程序能合并各类文本文件，如 .txt, .md, .text, .do，这样日后合并各类文件就方便多了。
     小魏说：V1.2.2还未开始解决此问题
*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


capture program drop appendtxts

program define appendtxts
	version 15.0
	syntax anything, [saving(string)]
	
	*输入待整合txt文件的路径
	*saving()输入整合后的文件名，默认为appendtxts_output.txt，不需输入扩展名.txt
	*可在文件名前添加保存路径，如 D:\文件名。默认最后一位 \ 后的内容为文件名
	*若不输入保存路径，则将整合后的文件保存到待整合文件的路径下
	
    local inputpath = subinstr(`"`anything'"',`"""',"",.)  //删除引号 ""
	
	if strpos(`"`inputpath'"', "\") | strpos(`"`inputpath'"', "/"){ //如果地址含有/ 或 \
	local inp1 = ustrrpos("`inputpath'","\")
    local inp2 = ustrrpos("`inputpath'","/")
	local inmax = max(`inp1',`inp2')
	local checkinp = substr(`"`inputpath'"',`=`inmax'+1',.)
	if "`checkinp'" == ""{  //如果地址以 / 或 \ 结尾
	global p = substr(`"`inputpath'"',1,`=`inmax'-1')
	}
	else { //如果地址不以 / 或 \ 结尾
	global p = subinstr(`"`anything'"',`"""',"",.)  //删除引号 ""
	}
	}
	
	else { //如果地址不含有 / 或 \
    global p = subinstr(`"`anything'"',`"""',"",.)  //删除引号 ""
	}
	
    qui cd "$p"  //路径转到待整合文件处
	
	
    local filename = "appendfiles_output.txt"
	*若saving非空，判断是否输入了路径和扩展名
	if "`saving'" ~= "" {
		local saving = 	subinstr(`"`saving'"',`"""',"",.) //删除引号 ""
		
		*判断是否输入了路径
		if strpos(`"`saving'"', "\") | strpos(`"`saving'"', "/"){ //若输入了路径
			local p1 = ustrrpos("`saving'","\")
			local p2 = ustrrpos("`saving'","/")
			local maxp = max(`p1',`p2')
		}
		else{ //若未输入路径
			local maxp = 0
		}
		
		local outputpath = substr(`"`saving'"',1,`maxp')       //路径名，若无则空
		local outputname = substr(`"`saving'"',`=`maxp'+1',.)  //文件名，可能为空
			
	
		*判断是文件名否输入了扩展名，扩展名位于文件名中的.之后
		local last_dot = ustrrpos("`outputname'",".")	
		if `last_dot' ~= 0 {  //如果存在扩展名
			local extension = substr(`"`outputname'"', `=`last_dot'+1',.)
	
			*如果扩展名不是.txt
			if ~inlist("`extension'", "txt"/*, "do", "md"*/){
			noi dis in red "The file extension .`extension' is not acceptable"
			noi dis in red "Please save in .txt files"
			//local all_last_dot = ustrrpos("`saving'",".") 
			//local strippedname = substr(`"`saving'"',`=`all_last_dot'+1',)
			local suggestname = substr(`"`outputname'"',1,`last_dot')
			noi dis in red "The name of the file could be `suggestname'txt"
			exit
			}
			*如果扩展名是.txt
			else {
			local filename = "`saving'"
			}
		}
		else{  //如果不存在扩展名
		local filename = "`saving'.txt"
			if "`outputname'" == "" {  //解决仅输入地址并以 / 或 \ 结尾的情况
			local filename = "`saving'appendfiles_output.txt"
			}		
		}
		}

		cap mkdir `outputpath'
		
	*若saving为空，则未指定输出文件名和路径，以appendfiles_output.txt输出至原文件夹下
	else{
		local filename = "appendfiles_output.txt"
		local maxp = 0
	}
	
	
    cap erase `filename'
  
    local s: dir "$p"  files "*.txt",  respectcase 
    qui dis `"`s'"'
	
    tokenize `"`s'"'  //切割字符串
		
    dis "第 1 个文件是： `1'"

    cap copy `"`1'"' `filename', replace 
  
    *-再次提取文件名，文件名先后顺序发生了变化
    local s: dir "$p"  files "*.txt",  respectcase 
    qui dis `"`s'"'   
  
    local Num = wordcount(`"`s'"')-1
    qui dis "`Num'"
	
	if `maxp' ~= 0 { //如果输入了保存路径，`Num' 不需要再 -1
		local Num = `Num'+1
		local checksamepath = substr("`outputpath'",1,`=`maxp'-1') 
		if "`checksamepath'" == "$p" {
		local Num = `Num'-1
		}
	}
		
		forvalues file=2/`Num' {  
			dis `"第 `file' 个文件是： ``file''"'
			appendfile `"``file''"' `filename'
		}
		
	disp "整合后的文件已保存为 `filename'"
		if `maxp' == 0 {
			disp "未指定输出路径，整合后的文件输出至原文件夹中"
		}
	
	shellout `filename'
	
	end